from flask import Blueprint, render_template, url_for, redirect, flash, request
from flask_login import login_user, logout_user, login_required, current_user
from sqlalchemy import select
from learn_flask.extensions import db
from learn_flask.models import User


# 创建认证蓝图
# 用于组织用户认证相关的视图函数
auth_bp = Blueprint('auth', __name__)


@auth_bp.route('/login', methods=['GET', 'POST'])
def login():
    """
    用户登录视图函数
    支持GET和POST两种请求方式
    GET: 返回登录页面
    POST: 处理登录请求
    """
    # 如果用户已经登录，则直接重定向到主页
    if current_user.is_authenticated:
        return redirect(url_for('main.index'))

    # 如果是POST请求，处理登录逻辑
    if request.method == 'POST':
        # 从表单获取用户名、密码和记住我选项
        username = request.form['username']
        password = request.form['password']
        remember = bool(request.form.get('remember'))

        # 验证用户名和密码是否为空
        if username and password:
            # 查询数据库中是否存在该用户名
            user = db.session.execute(select(User).where(User.username == username)).scalar()
            # 验证用户是否存在且密码正确
            if user and user.check_password(password):
                # 登录用户，remember参数控制是否记住用户
                login_user(user, remember=remember)
                # 闪现成功消息并重定向到主页
                flash('登录成功！')
                return redirect(url_for('main.index'))
            # 用户名或密码错误
            flash('无效的用户名或密码')
        else:
            # 用户名或密码为空
            flash('请输入用户名和密码')
    # GET请求或登录失败，返回登录页面
    return render_template('login.html')


@auth_bp.route('/logout')
@login_required  # 登录保护装饰器，只有登录用户才能访问
def logout():
    """
    用户登出视图函数
    
    Returns:
        redirect: 重定向到主页
    """
    # 登出当前用户
    logout_user()
    # 闪现消息并重定向到主页
    flash('再见！')
    return redirect(url_for('main.index'))